#pragma once
#ifndef INCLUDED_GAMELIB_BASE_OBJLIST_H
#define INCLUDED_GAMELIB_BASE_OBJLIST_H

typedef void * Obj;
typedef struct ObjListNode_* ObjListNode;
typedef struct ObjList_* ObjList;
typedef Obj (*ObjDestructor)( Obj );

Obj ObjListNode_GetObj( ObjListNode nodePtr );
ObjListNode ObjListNode_GetPrev( ObjListNode nodePtr );
ObjListNode ObjListNode_GetNext( ObjListNode nodePtr );

int ObjList_GetLength( ObjList listPtr );
ObjListNode ObjList_GetStartEdge( ObjList listPtr );
ObjListNode ObjList_GetEndEdge( ObjList listPtr );
ObjListNode ObjList_GetStart( ObjList listPtr );
ObjListNode ObjList_GetEnd( ObjList listPtr );
Boolean ObjList_IsEmpty( ObjList listPtr );
Boolean ObjList_IsStartEdge( ObjList listPtr, ObjListNode nodePtr );
Boolean ObjList_IsEndEdge( ObjList listPtr, ObjListNode nodePtr );
Boolean ObjList_IsStart( ObjList listPtr, ObjListNode nodePtr );
Boolean ObjList_IsEnd( ObjList listPtr, ObjListNode nodePtr );
ObjListNode ObjList_InsertObjToPrev( 
	ObjList listPtr, 
	ObjListNode currentNodePtr,
	Obj objPtr, 
	Obj (*destructor)( Obj ) 
);
ObjListNode ObjList_InsertObjToNext( 
	ObjList listPtr, 
	ObjListNode currentNodePtr,
	Obj objPtr, 
	Obj (*destructor)( Obj ) 
);
ObjListNode ObjList_InsertObjToStart( 
	ObjList listPtr, 
	Obj objPtr,
	Obj (*destructor)( Obj ) 
);
ObjListNode ObjList_InsertObjToEnd( 
	ObjList listPtr, 
	Obj objPtr,
	Obj (*destructor)( Obj ) 
);
ObjListNode ObjList_DeleteObjToPrev( ObjList listPtr, ObjListNode currentNodePtr );
ObjListNode ObjList_DeleteObjToNext( ObjList listPtr, ObjListNode currentNodePtr );
ObjListNode ObjList_DeleteObjFromStart( ObjList listPtr );
ObjListNode ObjList_DeleteObjFromEnd( ObjList listPtr );
ObjListNode ObjList_MoveObjToPrev(
	ObjList listPtr,
	ObjListNode fromNodePtr, 
	ObjListNode toNodePtr
);
ObjListNode ObjList_MoveObjToNext(
	ObjList listPtr,
	ObjListNode fromNodePtr, 
	ObjListNode toNodePtr
);
ObjListNode ObjList_MoveObjToStart( ObjList listPtr, ObjListNode fromNodePtr );
ObjListNode ObjList_MoveObjToEnd( ObjList listPtr, ObjListNode fromNodePtr );
ObjList ObjList_Create();
ObjList ObjList_Release( ObjList listPtr );

#endif	// INCLUDED_GAMELIB_BASE_OBJLIST_H
